package com.rp.admin.serivce.impl;

import com.rp.admin.mapper.CategoryMapper;
import com.rp.admin.serivce.CategoryService;
import com.rp.news.common.RedisCommon;
import com.rp.news.common.ResponseStatusEnum;
import com.rp.news.exception.GraceException;
import com.rp.news.util.RedisOperator;
import com.rp.pojo.Category;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

@Service
public class CategoryServiceImpl implements CategoryService {


    @Autowired
    private RedisOperator redis;

    @Autowired
    private CategoryMapper categoryMapper;

    @Transactional
    @Override
    public void createCategory(Category category) {
        // 分类不会很多，所以id不需要自增，这个表的数据也不会多到几万甚至分表，数据都会集中在一起
        int result = categoryMapper.insert(category);
        if (result != 1) {
            GraceException.display(ResponseStatusEnum.SYSTEM_OPERATION_ERROR);
        }

        /**
         * 不建议如下做法：
         * 1. 查询redis中的categoryList
         * 2. 转化categoryList为list类型
         * 3. 在categoryList中add一个当前的category
         * 4. 再次转换categoryList为json，并存入redis中
         */
        // 直接使用redis删除缓存即可，用户端在查询的时候会直接查库，再把最新的数据放入到缓存中
        redis.del(RedisCommon.REDIS_ALL_CATEGORY);
    }


    /**
     * 修改文章分类列表
     *
     * @param category
     */
    @Transactional
    @Override
    public void modifyCategory(Category category) {
        int result = categoryMapper.updateByPrimaryKey(category);
        if (result != 1) {
            GraceException.display(ResponseStatusEnum.SYSTEM_OPERATION_ERROR);
        }
        /**
         * 不建议如下做法：
         * 1. 查询redis中的categoryList
         * 2. 循环categoryList中拿到原来的老的数据
         * 3. 替换老的category为新的
         * 4. 再次转换categoryList为json，并存入redis中
         */

        // 直接使用redis删除缓存即可，用户端在查询的时候会直接查库，再把最新的数据放入到缓存中
        redis.del(RedisCommon.REDIS_ALL_CATEGORY);
    }


    /**
     * 查询文章分类名称是否存在
     *
     * @param catName
     * @param oldCatName
     * @return false : 存在 ; true: 不存在
     */
    @Override
    public boolean queryCatIsExist(String catName, String oldCatName) {
        Example example = new Example(Category.class);
        Example.Criteria catCriteria = example.createCriteria();
        catCriteria.andEqualTo("name", catName);
        if (StringUtils.isNotBlank(oldCatName)) {
            catCriteria.andNotEqualTo("name", oldCatName);
        }
        int count = categoryMapper.selectCountByExample(example);
        return count <= 0;
    }

    /**
     * 查询文章分类列表
     *
     * @return
     */
    @Override
    public List<Category> getCatList() {
        return categoryMapper.selectAll();
    }
}
